package com.lin.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.lin.entity.R;
import com.lin.entity.dto.BookDTO;
import com.lin.entity.dto.UpdateBookDTO;
import com.lin.entity.po.Book;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lin.entity.query.BookQuery;
import com.lin.entity.vo.BookVO;
import com.lin.entity.vo.PageVO;

import java.util.List;

public interface IBookService extends IService<Book> {
    /**
     * 新增图书--[x]需要管理员权限
     * @param bookDTO 图书信息
     * @return R
     */
    R addBook(BookDTO bookDTO);

    /**
     * 修改图书--[x]需要管理员权限
     * @param updateBookDTO 图书信息
     * @return R
     */
    R updateBook(UpdateBookDTO updateBookDTO);

    /**
     * 获取图书信息--先查询Redis中是否有对应数据, 存在直接返回
     * 不存在则查询数据库并添加到Redis中
     * @param bookId 图书id
     * @return R
     */
    BookVO getBookById(Integer bookId) throws JsonProcessingException;

    /**
     * 获取图书列表--基础分页
     * 先查询Redis中是否有对应数据, 存在直接返回
     * 不存在则查询数据库并添加到Redis中
     * @param page 当前页码
     * @param pageSize 每页数量
     * @return R
     */
    PageVO<BookVO> getBookList(int page, int pageSize) throws JsonProcessingException;

    /**
     * 获取图书列表--条件分页
     * 先查询Redis中是否有对应数据, 存在直接返回
     * 不存在则查询数据库并添加到Redis中
     * @param bookQuery 查询条件
     * @return List<BookVO>
     */
    PageVO<BookVO> getBooksPage(BookQuery bookQuery) throws JsonProcessingException;

    /**
     * 获取图书列表--条件分页
     * 先查看Redis中是否有对应数据, 存在直接返回
     * 不存在则查询数据库并添加到Redis中
     * @param bookQuery 查询条件
     * @param orderBy 按字符顺序排序 or 按字符长度排序; 默认按字符顺序
     * @return List<BookVO>
     */
    PageVO<BookVO> getBooksPageByCharLen(BookQuery bookQuery, boolean orderBy) throws JsonProcessingException;

    /**
     * 逻辑删除图书
     * @param id 图书ID
     * @return T/F
     */
    boolean logicDeleteBook(Integer id);
}
